<?php
/**
 * Created by Denis S.
 * Date: 03.04.11
 * Time: 15:42
 */

class cellEntity
{
    /**
     * Виды стен:
     */
    const EXTREME_WALL  = 1; // Крайняя стена (нельзя пройти)
    const STONE_WALL    = 2; // Каменная стена (нельзя пройти)
    const EMPTY_WALL    = 3; // Пустая стена (можно пройти)
    const FINISH_WALL   = 4; // Финишная стена
    const START_WALL    = 5; // Стартовая стена

    /**
     * Массив непроходимых стен
     * @var array
     */
    public static $arrImpassableWalls = array (
        self::EXTREME_WALL,
        self::STONE_WALL
    );

    /**
     * Массив стен, через которые можно пройти
     * @var array
     */
    public static $arrTraversedWalls = array(
        self::EMPTY_WALL
    );

    /**
     * Каждая стена может быть определенного вида
     */
    protected $_upWall      = null;
    protected $_downWall    = null;
    protected $_leftWall    = null;
    protected $_rightWall   = null;

    /**
     * Координаты ячейки
     */
    protected $_x = null;
    protected $_y = null;

    /**
     * Статус ячейки
     */
    protected $_start  = false;
    protected $_finish = false;

    /**
     * @param int $coordinateX
     * @param int $coordinateY
     * @param bool $start
     * @param bool $finish
     */
    public function __construct($coordinateX, $coordinateY, $start = false, $finish = false)
    {
        $this->setX($coordinateX);
        $this->setY($coordinateY);

        if ($start) {
            $this->setStart(true);
        }

        if ($finish) {
            $this->setFinish(true);
        }
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setUpWall($value)
    {
        $this->_upWall = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getUpWall()
    {
        return $this->_upWall;
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setDownWall($value)
    {
        $this->_downWall = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getDownWall()
    {
        return $this->_downWall;
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setLeftWall($value)
    {
        $this->_leftWall = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getLeftWall()
    {
        return $this->_leftWall;
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setRightWall($value)
    {
        $this->_rightWall = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getRightWall()
    {
        return $this->_rightWall;
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setX($value)
    {
        $this->_x = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getX()
    {
        return $this->_x;
    }

    /**
     * @param int $value
     * @return cellEntity
     */
    public function setY($value)
    {
        $this->_y = $value;
        return $this;
    }

    /**
     * @return null|int
     */
    public function getY()
    {
        return $this->_y;
    }

    /**
     * @param boolean $value
     * @return cellEntity
     */
    public function setStart($value)
    {
        $this->_start = $value;
        return $this;
    }

    /**
     * @return boolean
     */
    public function getStart()
    {
        return $this->_start;
    }

    /**
     * @param boolean $value
     * @return cellEntity
     */
    public function setFinish($value)
    {
        $this->_finish = $value;
        return $this;
    }

    /**
     * @return boolean
     */
    public function getFinish()
    {
        return $this->_finish;
    }
}